package com.steve.combat.algorithm.douyin;

/**
 * @Author: STEVE
 * @Description: 计算2的N次幂
 * @since: 2025-04-18
 */
public class PowerOfNumberIterative {

    public static void main(String[] args) {
        double result = power(2, 10);
        System.out.println(result);
    }

    // 迭代方法
    public static double power(double x, int n) {
        double result = 1.0;
        long longN = Math.abs((long) n);
        while (longN > 0) {
            if ((longN & 1) != 0) {  // 检查最低位是否为1（奇数情况）
                result *= x;    // 累乘底数x到结果中
            }
            x *= x; // 将底数平方以备下一次迭代使用（偶数情况）
            longN >>= 1; // 将指数右移一位（等同于除以2）
        }
        return n < 0 ? 1 / result : result; // 处理负指数的情况并返回最终结果
    }

    // 递归方法
    public static double power2(double x, int n) {
        if (n == 0) {
            return 1;
        }
        if (n < 0) {
            return 1 / power2(x, -n);
        }
        // 递归
        double half = power2(x, n / 2);
        if (n % 2 == 0) {
            return half * half;
        } else {
            return half * half * x;
        }
    }

}
